package com.ceair.controller;

import com.ceair.entity.request.authority.AuthorityInOrUpReq;
import com.ceair.entity.request.authority.DeleteAuthorityReq;
import com.ceair.entity.result.Result;
import com.ceair.entity.vo.authority.SysAuthorityVO;
import com.ceair.entity.vo.role.RoleAuthorityVO;
import com.ceair.service.ISysAuthorityService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author wangbaohai
 * @ClassName SysAuthorityController
 * @description: 菜单权限接口
 * @date 2025年03月05日
 * @version: 1.0.0
 */
@RestController
@RequestMapping("/api/v1/authority")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "菜单权限管理", description = "菜单权限管理相关接口")
public class SysAuthorityController {

    private final ISysAuthorityService sysAuthorityService;

    /**
     * 查询系统中所有菜单权限的方法
     * 该方法无需参数，返回一个包含所有角色权限的列表
     * 主要用于后台管理，以便管理员查看或配置系统权限
     *
     * @return 包含所有角色权限信息的列表，封装在Result对象中
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/authority/queryAllAuthority')")
    @Parameter(name = "queryAllAuthorityReq", description = "查询所有菜单权限请求对象", required = true)
    @Operation(summary = "查询所有菜单权限")
    @PostMapping("/queryAllAuthority")
    public Result<List<RoleAuthorityVO>> queryAllAuthority() {
        // 调用服务层方法查询所有权限，并将结果封装为成功响应返回
        return Result.success(sysAuthorityService.queryAllAuthority());
    }

    /**
     * 新增或更新菜单权限的接口方法
     * <p>
     * 该方法接收一个菜单权限新增或更新请求对象，通过调用服务层方法来保存权限信息
     * 主要用于处理菜单权限的创建或修改请求
     *
     * @param authorityInOrUpReq 菜单权限新增或更新请求对象，包含需要保存的权限信息
     * @return 返回一个封装了保存结果的Result对象，包含成功保存后的SysAuthorityVO对象
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/authority/save')")
    @Parameter(name = "authorityInOrUpReq", description = "菜单权限新增或更新请求对象", required = true)
    @Operation(summary = "新增或更新菜单权限")
    @PostMapping("/save")
    public Result<SysAuthorityVO> save(@RequestBody AuthorityInOrUpReq authorityInOrUpReq) {
        // 初始化
        SysAuthorityVO sysAuthorityVO;

        // 调用服务层方法保存权限信息，并将结果封装为成功响应返回
        try {
            sysAuthorityVO = sysAuthorityService.save(authorityInOrUpReq);
        } catch (Exception e) {
            // 处理异常，记录错误信息
            log.error("新增或更新权限失败 具体原因为 : {}", e.getMessage());
            return Result.error("新增或更新权限失败,失败原因：" + e.getMessage());
        }

        return Result.success(sysAuthorityVO);
    }

    /**
     * 删除菜单权限的接口方法。
     * <p>
     * 该方法接收一个删除菜单权限请求对象，通过调用服务层方法来执行删除操作。
     * 如果删除成功，则返回一个封装了成功结果的Result对象；如果删除失败，则记录错误信息并返回包含错误信息的Result对象。
     *
     * @param deleteAuthorityReq 删除菜单权限请求对象，包含需要删除的权限信息
     * @return 返回一个封装了删除结果的Result对象，包含布尔值表示删除是否成功
     */
    @PreAuthorize("hasAnyAuthority('/api/v1/authority/delete')")
    @Parameter(name = "deleteAuthorityReq", description = "删除菜单权限请求对象", required = true)
    @Operation(summary = "删除菜单权限")
    @PostMapping("/delete")
    public Result<Boolean> delete(@RequestBody DeleteAuthorityReq deleteAuthorityReq) {
        Boolean result;
        try {
            result = sysAuthorityService.delete(deleteAuthorityReq);
        } catch (Exception e) {
            // 处理异常，记录错误信息
            log.error("删除权限失败 具体原因为 : {}", e.getMessage());
            return Result.error("删除权限失败,失败原因：" + e.getMessage());
        }
        return Result.success(result);
    }


}
